home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network Supervisor's Toolkit
/
Network Supervisor's Toolkit.iso
/
btrieve
/
breset
/
breset.cpp
next >
Wrap
C/C++ Source or Header
|
1996-07-10
|
18KB
|
467 lines
/*
BRESET.CPP V1.2
===============
Date Created : 1/18/93
Created by : John Leon
Dates Modified: 1/28/93 - added batch mode switch (see below)
2/5/94 - minor cosmetic changes to code
Last Mod by : John Leon
Tools Used : 1.) Borland C++ 3.1
2.) Netware C Interface for DOS
3.) BTC Class Library V1.8
4.) Novell's Brequest
Model : SMALL.
Purpose : To do a Btrieve reset on one of the following:
1.) Your workstation (specify -1 on command line),
2.) A single workstation (by specifying connection #), or
3.) All workstations on a network (no command line para-
meter and no BRESET.NOT file in default directory),
4.) All but those in a list (we'll exclude ALL connections
for each name in the list), by specifying no command
line parameter and having an ascii file named
BRESET.NOT in the current directory. This file must
contain the user names (case not significant) of all
those to be excluded from reset.
Requirements : 1.) Must have Brequest loaded (and obviously must have the
Btrieve NLM running on your server).
2.) MUST be run from a network drive,
3.) User running this program must have supervisory rights
in the directory from which this program is run, and
4.) User must have console operator privileges.
Comments : 1.) See declaration of BTRV() in BTC.HPP.
2.) A "batch mode" switch exists (pass a parameter of /b)
to bypass the warning mechanism when performing #3 or
#4 under PURPOSE, which would otherwise require a user
response.
3.) As written, program supports only versions of Netware
up to 250 connections. More specifically, there is
a limit on how many connections to exclude from reset
equal to EXCLUDELIMIT.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dir.h> //For getdisk().
#include <conio.h> //For wherex(), wherey(), gotoxy(), clreol().
#include <io.h> //For access().
extern "C" {
#include <nwconn.h>
#include <nwdir.h>
#include <ntt.h>
#include <nwconsol.h>
#include <nwbindry.h>
}
#pragma hdrstop
#include "btc.hpp" //For BtrieveIsLoaded(), CreateBTFile(), and classes
//CFileSpec and BFile.
/* DEFINES & CONSTANTS */
/* ------------------------------------------------------------------------ */
#define TEMPFILE "Breset.BTR"
#define EXCLUDEFILE "Breset.NOT"
#define SUPERVISOR_DIR_RIGHTS_386 0x0100
const int USERNAMELENGTH = 48, EXCLUDELIMIT = 250, MAXCONNECTIONS = 250;
/* GLOBALS */
/* ------------------------------------------------------------------------ */
char PositionBlock[128], FileBuffer[5];
int BufferSize = 5;
WORD myConnNumber;
/* PROTOTYPES */
/* ------------------------------------------------------------------------ */
int UserIsLoggedIn();
int CheckRights();
int MakeBTRNLMConnection();
int SecondChance();
int ResetWithExcludeList();
void ResetAllOtherStations();
int ResetSingleStation(WORD connNumber);
int PerformOneReset(const char *stationNumberString);
int ConnectionIsActive(int connID);
/* MAIN */
/* ======================================================================== */
int main(int argc, char *argv[])
{
/* Get preliminary checks out of the way. */
if ( !BtrieveIsLoaded() ) {
printf("\nPlease load Brequest before running this program\n");
exit(1);
}
if ( argc > 2 ) {
printf("\nToo many command-line parameters ... aborting\n");
exit(2);
}
if ( !GetDirectoryHandle(getdisk()) ) {
printf("\nThis program must be run from a network drive ... aborting\n");
exit(3);
}
/* Save connection ID of PC running the
program. May need it later. */
myConnNumber = GetConnectionNumber();
if ( !myConnNumber ) {
printf("\nThis program requires a Novell network connection, supervisor\n");
printf("privileges in the current directory, console operator privileges,\n");
printf("and must be run from a network drive ... aborting\n");
exit(4);
}
if ( !UserIsLoggedIn() ) {
printf("\nYou must be logged into your network to run this program\n");
exit(5);
}
/* OK ... Have confirmed user is logged into
the net, has Btrieve loaded, and has
default drive set to a remote (network)
drive. Now confirm they have supervisor
directory rights in the default direc-
tory, that the mapped volume is not just
remote but is on a Netware 3.0+ server,
and that they have console operator
security equivalence. */
if ( CheckConsolePrivileges() || CheckRights() ) {
printf("You have insufficient network rights to run this program.\n");
printf("This program requires console operator privilege level and\n");
printf("supervisory rights to the current directory ... aborting.\n");
exit(6);
}
/* Do just enough Btrieve I/O to get a
Btrieve NLM connection. Create a
Btrieve file on the fly, open it in
exclusive mode, close it, then delete
the darn thing. */
if ( MakeBTRNLMConnection() ) {
printf("\nCould not confirm your own connection to BTRIEVE NLM"
" ... aborting\n");
exit(7);
}
/* If an exclusion list (BRESET.NOT) exists,
be prepared to process it. */
boolean excludeListPresent = (access(EXCLUDEFILE, 0) == 0) ? true : false;
/* Here's the main switch. Could get 1 of
following 4 cases, so act accordingly!
BRESET -1 (reset yourself)
BRESET xxx (xxx = a connection number)
BRESET (BRESET.NOT file present or not)
BRESET /B (batch mode - no warnings) */
switch (argc) {
case 1: if ( !SecondChance() ) { // No parameter given, so give warning.
if ( excludeListPresent )
ResetWithExcludeList();
else {
ResetAllOtherStations();
ResetSingleStation(myConnNumber);
}
}
break;
case 2: char argv1[10];
strcpy(argv1, argv[1]);
if ( strlen(argv1) > 3 ) {
printf("\nInvalid command line parameter ... aborting\n");
break;
}
strupr(argv1);
if ( (!strncmp(argv1, "/B", 2)) || (!strncmp(argv1, "-B", 2)) ||
(!strncmp(argv1, "B", 1)) ) {
// We're in batch mode. No warnings, Jack.
if ( excludeListPresent )
ResetWithExcludeList();
else {
ResetAllOtherStations();
ResetSingleStation(myConnNumber);
}
break;
}
// Not in batch mode, so test for parameter being -1 or a valid
// connection, and just do it.
PerformOneReset(argv1);
break;
default: printf("\nUnexpected program condition ... aborting\n");
}
return 0;
} //end MAIN
/* FUNCTION DEFINITIONS */
/* ------------------------------------------------------------------------ */
/* Create a Btrieve file on the fly,
open it, close it, then delete it.
This action establishes the required
connection with the Btrieve NLM. */
int MakeBTRNLMConnection() {
//Create an arbitrary file of record length 5, page size 512, no keys.
CFileSpec *fSpec = new CFileSpec(5, 512, 0, NULL);
BStatus = CreateBTFile(TEMPFILE, fSpec->Specs);
delete fSpec;
if ( BStatus )
return 1;
//Open the new file in exclusive mode, no owner name, data buffer 5 bytes.
//Destructor called when object deleted will close the file.
BFile *resetBTR = new BFile(TEMPFILE, Exclusive, "", 5);
delete resetBTR;
remove(TEMPFILE);
return (BStatus ? 2 : 0);
}
/* Reset all connections NOT associated with
usernames in the EXCLUDEFILE. If a user
name in the EXCLUDEFILE has multiple
connections, NONE of the connections for
that user name will be reset. */
int ResetWithExcludeList() {
//Have previously confirmed that EXCLUDEFILE is present, but safety first.
FILE *excludeFile;
if ( (excludeFile = fopen(EXCLUDEFILE, "rt")) == NULL ) {
printf("\nError opening %s ... aborting\n", EXCLUDEFILE);
return 1;
}
char excludeSingleName[USERNAMELENGTH];
int Counter = 0, numConnsExcluded = 0;
WORD timesUserConnected;
WORD *excludeConnList = new WORD[EXCLUDELIMIT]; //Array of 250 conn numbers,
//enough to hold max #
//of connections to exclude.
printf("\n ** EXCLUDED FROM RESET **\n"
"---------------------------------\n");
while ( (fgets(excludeSingleName, USERNAMELENGTH, excludeFile) != NULL) &&
(Counter < EXCLUDELIMIT) ) {
//Get rid of the cr/lf combo at end of string read.
excludeSingleName[strlen(excludeSingleName)-1] = '\0';
strupr(excludeSingleName);
if ( GetObjectConnectionNumbers(excludeSingleName,
OT_USER,
×UserConnected,
&excludeConnList[numConnsExcluded],
MAXCONNECTIONS) == 0 )
if ( timesUserConnected )
printf("%s on %u connections\n", excludeSingleName,
timesUserConnected);
numConnsExcluded += timesUserConnected;
Counter++;
}
fclose(excludeFile);
if ( !Counter ) {
printf("Program aborted ... \n"
"Could not interpret data in file %s", EXCLUDEFILE);
return 2;
}
printf("---------------------------------\n"
"Total # excluded connections: %d\n", numConnsExcluded);
boolean resetSelf = true, okToReset; //Assume OK to reset self for now.
for (Counter = 0; Counter < numConnsExcluded; Counter++) {
if ( myConnNumber == excludeConnList[Counter] ) {
resetSelf = false;
break;
}
}
FILE_SERV_INFO serverInfo;
GetServerInformation(sizeof(serverInfo), &serverInfo);
printf("\nResetting connection # ");
int x = wherex(), y = wherey();
int Counter1;
for ( Counter = 1; Counter < (serverInfo.maxConnectionsSupported+1); Counter++ ) {
if ( Counter != myConnNumber ) { //Don't reset yourself mid-stream!
Counter1 = 0;
okToReset = true;
//hmmm...potentially gotta traverse entire exclude list for each valid
//conn number from 1 to maxConnectionsSupported just to see if it is
//in the (unsorted) list of connections to be excluded ... but at
//least we break if it's found in list before end of list.
/* Important here to use EXCLUDELIMIT versus
server's max # connections, as one can
have a LARGE number of login IDs that has
no relation to server's conn limit; thus,
the exclude file can be larger than #
connections permitted. */
for (Counter1; Counter1 < EXCLUDELIMIT; Counter1++) {
if ( Counter == excludeConnList[Counter1] ) {
okToReset = false;
break;
}
}
if ( okToReset ) {
gotoxy(x, y);
printf("%d", Counter);
BTRV(BReset, PositionBlock, &FileBuffer, &BufferSize,
(void *)&Counter, -1);
}
}
}
gotoxy(1,y);
clreol();
printf("Done.\n");
delete [] excludeConnList;
if ( resetSelf )
ResetSingleStation(myConnNumber);
return 0;
}
/* To reset all stations but your own. */
void ResetAllOtherStations() {
FILE_SERV_INFO serverInfo;
GetServerInformation(sizeof(serverInfo), &serverInfo);
printf("\nResetting connection # ");
int x = wherex(), y = wherey();
for ( int Counter = 1; Counter < (serverInfo.maxConnectionsSupported+1); Counter++ )
if ( Counter != myConnNumber ) {
gotoxy(x, y);
printf("%d", Counter);
BTRV(BReset, PositionBlock, &FileBuffer, &BufferSize, (void *)&Counter, -1);
}
gotoxy(1,y);
clreol();
printf("Done.\n");
}
int ResetSingleStation(WORD connNumber) {
BStatus = BTRV(BReset, PositionBlock, &FileBuffer, &BufferSize,
(void *)&connNumber, -1);
if ( !BStatus ) {
printf("\nConnection # %u has been reset\n", connNumber);
return 0;
}
else {
printf("\nError in attempt to reset connection # %u\n", connNumber);
printf("Btrieve status code: %d\n", BStatus);
return BStatus;
}
}
int CheckRights() {
BYTE currentDrive = (BYTE)getdisk(), dirHandle;
WORD serverConnID, dirRights;
int cCode;
GetDriveInformation(currentDrive, &serverConnID, &dirHandle);
if (!IsV3Supported(serverConnID)) {
printf("\nThis program requires Netware 386 3.0 or higher on current drive.\n");
return 1;
}
if ( (cCode = GetEffectiveRights(serverConnID, dirHandle, "",
&dirRights) ) != 0 ) {
printf("\nCannot determine your directory rights. Code: %d\n", cCode);
return 2;
}
if ( (dirRights & SUPERVISOR_DIR_RIGHTS_386) != SUPERVISOR_DIR_RIGHTS_386 ) {
printf("\nYou have insufficient directory rights to run this program.\n");
return 3;
}
return 0;
}
int ConnectionIsActive(int connID) {
char userName[USERNAMELENGTH];
long objID;
WORD objType;
BYTE loginTime[7];
GetConnectionInformation(connID, userName, &objType, &objID, loginTime);
return ( objID ? 1 : 0 ); //objID of 0 means no object logged in on connID
}
int UserIsLoggedIn() { //Returns 0 if user not logged in to network.
char userName[USERNAMELENGTH];
long objID;
WORD objType;
BYTE loginTime[7];
if ( !GetConnectionInformation(myConnNumber, userName, &objType,
&objID, loginTime) )
return 1;
else
return 0; //Flip response for lexical sense ...such that
} //!UserIsLoggedIn makes sense.
int SecondChance() {
printf("\nWARNING!! If you continue, ALL workstations on your network\n");
printf( "will receive a Btrieve reset, excluding only those\n");
printf( "user names present in the %s file. If you suspect \n",
EXCLUDEFILE);
printf( "ANY users are in Btrieve applications that should not\n");
printf( "be reset, you MUST ANSWER THE FOLLOWING PROMPT \"NO\"!!\n");
printf("\nRESET WORKSTATIONS? (Y/N): \a\a");
char response[5];
gets(response);
strupr(response);
if ( !strlen(response) || (response[0] != 'Y') ) {
printf("\nOperation aborted ...\n");
return 1;
}
return 0;
}
int PerformOneReset(const char *stationNumberString) {
int stationNumber;
if ( (stationNumber = atoi(stationNumberString)) == 0 ) {
printf("\nInvalid parameter ... aborting\n");
return 1;
}
if ( stationNumber == myConnNumber ) {
printf("\nERROR: You have selected your own connection ID for reset.\n");
printf(" If you wish to reset your own connection, enter -1 and\n");
printf(" NOT your actual connection number.\n");
return 2;
}
if ( stationNumber == -1 ) {
printf("\nResetting your connection ... \n");
ResetSingleStation(myConnNumber);
return 0;
}
if ( stationNumber > 0 && stationNumber < 251 )
if ( ConnectionIsActive(stationNumber) ) {
ResetSingleStation(stationNumber);
return 0;
}
else {
printf("\nConnection #%d is not in use ... aborting\n", stationNumber);
return 3;
}
else {
printf("\nInvalid connection number specified ... aborting\n");
return 4;
}
}